/*
 * Copyright 2023 the original author or authors.
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * https://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.openrewrite.protobuf;

import org.junit.jupiter.api.Test;
import org.openrewrite.SourceFile;
import org.openrewrite.test.RewriteTest;
import org.openrewrite.text.PlainText;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;
import static org.openrewrite.protobuf.Assertions.proto;

class ProtoParserTest implements RewriteTest {
    @Test
    void noNullsForProto3Files() {
        List<SourceFile> sources = ProtoParser.builder().build().parse("syntax = \"proto3\";").toList();
        assertThat(sources).singleElement().isInstanceOf(PlainText.class);
    }

    @Test
    void unicodeInComments() {
        String protoSource = """
            syntax = "proto2";

            // 👇 Problem below
            message Person {
              required string name /*  👆*/=/* 👆*/ 1; /*👆*/
              required string emoji = 2 [default = "👇"];
              // 👆 Problem above
            }
            """;
        List<SourceFile> sources = ProtoParser.builder().build().parse(protoSource).toList();
        assertThat(sources).hasSize(1);
        assertThat(sources.get(0).printAll()).isEqualTo(protoSource);
    }

    @Test
    void moreUnicodeInComments() {
        rewriteRun(
          proto(
            """
              syntax = 'proto2';
              service SearchService {
                /*👆👆*/ rpc /*👆👆*/ Search /*👆👆*/(/*👆👆*/ SearchRequest ) returns ( SearchResponse );
              }
              """
          )
        );
    }

    @Test
    void protoWithoutSyntaxDeclaration() {
        rewriteRun(
          proto(
            """
            message Point {
              required int32 x = 1;
              required int32 y = 2;
              optional string label = 3;
            }
            """
          )
        );
    }
}
